{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open('./MNIST_data/train-images-idx3-ubyte', 'rb') as f:\n",
    "    buffer = f.read(4*4) # 4个int\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    #每张图片像素\n",
    "    length = head[1] * head[2]  * head[3]\n",
    "    print(length)\n",
    "    buffer = f.read(length)\n",
    "#   print(buffer)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "47040000\n"
     ]
    }
   ],
   "source": [
    "print(len(data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "imgs=np.reshape(data,(head[1],head[2],head[3]))\n",
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i],cmap='gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\feature_extraction\\text.py:17: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working\n",
      "  from collections import Mapping, defaultdict\n"
     ]
    }
   ],
   "source": [
    "#获取数据\n",
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original', data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DESCR 数据集描述\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X,y=mnist['data'],mnist['target']\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,  86, 131, 225, 225, 225,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,  13,  73, 197, 253, 252, 252, 252, 252,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,\n",
       "         29,  29, 154, 187, 252, 252, 253, 252, 252, 233, 145,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  29,\n",
       "        252, 253, 252, 252, 252, 252, 253, 204, 112,  37,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 169,\n",
       "        253, 255, 253, 228, 126,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  98, 243,\n",
       "        252, 253, 252, 246, 130,  38,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  98, 240, 252,\n",
       "        252, 253, 252, 252, 252, 221,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 225, 252, 252,\n",
       "        236, 225, 223, 230, 252, 252,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 146, 252, 157,\n",
       "         50,   0,   0,  25, 205, 252,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,  26, 207, 253,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,  29,  19,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,  73, 205, 252,  79,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0, 120, 215, 209, 175,   0,   0,   0,   0,   0,\n",
       "          0,   0,  19, 209, 252, 220,  79,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0, 174, 252, 252, 239, 140,   0,   0,   0,   0,\n",
       "          0,  29, 104, 252, 249, 177,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0, 174, 252, 252, 223,   0,   0,   0,   0,   0,\n",
       "          0, 174, 252, 252, 223,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0, 141, 241, 253, 146,   0,   0,   0,   0, 169,\n",
       "        253, 255, 253, 253,  84,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0, 178, 252, 154,  85,  85, 210, 225, 243,\n",
       "        252, 215, 121,  27,   9,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,  66, 208, 220, 252, 253, 252, 252, 214,\n",
       "        195,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,  19,  37,  84, 146, 223, 114,  28,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0],\n",
       "       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n",
       "          0,   0]], dtype=uint8)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "some_digit=X[36000]\n",
    "some_digit_image=some_digit.reshape(28,28)\n",
    "#查看图片与X[36000]的关系，数字越大越像是这个数\n",
    "some_digit_image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "X_train,X_test,y_train,y_test=X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([59959, 32569, 35528, ..., 24354,  5230, 32364])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shuffle_index=np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train,y_train=X_train[shuffle_index],y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练一个二元分类器\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False,  True,  True, ..., False, False,  True])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5=(y_train==5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True,  True, ..., False, False, False],\n",
       "       [False, False, False, ...,  True, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False,  True, ...,  True, False, False],\n",
       "       [False, False, False, ..., False, False,  True]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test == 5) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#scd梯度下降分类器,一次一个\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42)\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "性能考核"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.956  , 0.96375, 0.96055])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "#查看不是五的准确率\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self,X,y=None):\n",
    "        pass\n",
    "    def predict(self,X):\n",
    "        return np.zeros((len(X),1),dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#获取预测的类型\n",
    "np.zeros((len(X),1),dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "never_5_clf=Never5Classifier()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9093 , 0.9072 , 0.91245])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#s使用交叉验证测量never_5_clf精度\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "混淆矩阵\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#交叉验证\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53134,  1445],\n",
       "       [  949,  4472]], dtype=int64)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "#混淆矩阵部分\n",
    "confusion_matrix(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions=y_train_5\n",
    "confusion_matrix(y_train_5,y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "精度和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7557884062869697"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "#精度\n",
    "precision_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8249400479616307"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#召回率\n",
    "recall_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7888516493208678"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "#F1值是精度和召回率的调和平均值。\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\nfrom sklearn.linear_model import LogisticRegression;\\nclf=LogisticRegression()\\nclf.fit(X_train,y_train)\\n# pred_proba是每个实例为真的概率\\npre_proba=clf.predict_proba(X_test)[:1]\\n#设置阈值\\nthreshold=0.75\\npred_label=pred_proba>threshold\\n'"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用逻辑回归来训练\n",
    "'''\n",
    "from sklearn.linear_model import LogisticRegression;\n",
    "clf=LogisticRegression()\n",
    "clf.fit(X_train,y_train)\n",
    "# pred_proba是每个实例为真的概率\n",
    "pre_proba=clf.predict_proba(X_test)[:1]\n",
    "#设置阈值\n",
    "threshold=0.75\n",
    "pred_label=pred_proba>threshold\n",
    "'''\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([77638.1748611])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#返回决策\n",
    "y_scores=sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold=0\n",
    "y_some_digit_pred=(y_scores>threshold)\n",
    "y_some_digit_pred\n",
    "#true表示概率大于零的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 提高阀值可以降低召回率，提高阀值到200000，就错了这个图\n",
    "threshold=200000\n",
    "y_some_digit_pred=(y_scores>threshold)\n",
    "y_scores=cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "#精度和召回和阈值\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAF5CAYAAACV7fNGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deZwU5Z3H8e9vhlPOURBEQUHxNghMEBQVEAluosZ4xQM10fWKwWh0Qwwmrkc81iUaFSOrrvGIBJNdzWEMnuCtg4DxSFZUFIlcgtzIMb/94+mxZoY5uofuqj4+79erX/V099NVP9p5+e2qeuopc3cBAIDiV5Z0AQAAIB6EPgAAJYLQBwCgRBD6AACUCEIfAIASQegDAFAiCH0AAEpE7KFvZj3M7Plm+txjZi+b2cS46gIAoNjFGvpmViHp15I6NNHnW5LK3X2YpH5m1j+u+gAAKGZx7+lvkXSypFVN9BkhaVqqPV3S8BzXBABASWgV58bcfZUkmVlT3TpIWphqL5c0qH4HMztX0rmS1KpVxeDOnft9+d7y5WH5la9IrVtnoWgAAPLMrFmzlrl790w/F2vop2mNpPapdkc1cDTC3adImiJJlZWVXlVV9eV7vXpJn34q/eUvoZ3P3KW1a6VVq6SVK6NlQ+1ly6Qjjwz/prZtpUMOkcoYhgkAJcnMPmrJ5/Ix9GcpHNJ/RdIASf9oyUq2bGn49c8+k5YskfbZJ/31LFgg9e4tlZc33989BPVHH0kffywtWiQtXRq2WX+5bJm0aVP6/6YHH9z6tQMPlHbdNfwwqHmsXh22+/HHoe7Nm6MfED16SB0aHVEBAChmiYa+me0r6VR3rz1K/1FJz5tZL0lHSRqayTprwr5PH+kPf5COPjoE8TPPSJMnS//zP+H9114L4ffnP0sHHxz2nCXpww9D36oqafbssNyyRerZU/rb36Ru3cL6Fi+W3nknPN59V5o/Pwr61avTr7d9e6lLF6lz57BsqL12rXTPPVL//tLrr9f9/Jw54dGQPn2k7baT1q3b+r3hw8O/5a23pGuukfr2lTZskAYOlNavD3V17hz6btxY96jDqlXSfvtJ3TM+sAQASJLl4611U6P8j5Q0090XNdW3/uH92sMFfvpT6dvfli68UHruuaa3ed550vTpIfSbcuihIShXrGi8T4cOYe+7T59wOL57d2nHHcOyfrtdu6a315DPPgs/LJ56SmrTJoRzp05h2blz+HHzy19G/cvKwuuff575ttq1Cz8GGtKvn1RdHX7wjBkTfmCceWb4cbBkSRhXMWJEOB0BAMgeM5vl7pUZfy4fQz8T9UN/1Cjp2WdDe9ddwx75hg1S167SpZeGoJw5s/H1de0qjRwZ9vwHDpT23VcaPFj65z/r9uvSJezt7rtvOFWwxx4h5Pv0kSoq6v74SMKKFeEIQZcuUseOoZ6NG8ORgldfDf/Ot96SfvGLUPuyZeFHQatW4XRAbeXldY88zJ2bWS177CG9/750773SWWdl7Z8IACWL0E/ZtEmaMEGaNCnqc9ZZIdy6dpWef1666y7phBPC3umRR4YR/yeeGE4FDBq09bn76mrphhtCGFZWhvPoO+2UfLBnW3V19G/68MOwl9+lS9iDr/1vXbs2nPro0CH8uFi0SLr99nC1RJcu4fD/jBmNb+egg6TRo6W//z38uFq7NqxnxYrww6OmvWRJGJTZqpV08snSnnuGbR1wQBhnMWBA+CGzyy7h6ELNZ/v2Dacuysqi0xL77RceZWXhM2vW5MePMwBoCUK/lksukW65JbRvu0266KIECoPefz+cinj+eemyy5KuJmjdeuvBk3fcIZ1ySvgRAACFgNCv5dFHpZNOkq66SrriimTqQl3u0pQp4dTK9tuHPfUtW8LVBV27hsCt/ejaNezVL1gg3X13ODrw3HNhb/3tt8MYhldekfbfP6yv5ihO377SG2+EUy5duoRBjo2NSahvwIBw6mLoUGnevHBaZ84caa+9pN13D0cJOnUKRymGDw/rB4AkEPr1bNjQskFyKE7V1WF8R+fO4XTFli3S1VdLv/lNOCLRUr17h0GgZmE9++wTfpScckoYxLn33uH0RE0NzK0AIBsIfaCFPvssDHCsubTxgw/CJZoffBDGHey8s/Tmm9I//hEuy2yJTp3qXsrZs2c4ojBzZhij8MEH0gUXhEGPHTuGUxDduoXxCCtWhHEn3buHox9lZeGSys8+C1dOjBwZjqTsvXe4YoJxCkDxI/SBmGzYIE2cGIJ60aIQtLNmhVMPM2aEIE7aMceEQZKjR4cfGNXV4YhDz55JVwYgGwh9IA+9914I265dw2mFt96SHn88HD1YvTqcZrjmmnDlQf/+ob9Z2Kvv2zd87oUXpGHDwudfey2EeZcu4RLIAw9sfHKmptQceTjzzHB1S5cu4eoIZmsECgOhD5Q493DE4dprpccei14vKwt7+umoPRlTebl0663hMtWayx232y77dQPIHKEPoEnr14eJmbp0CdM633FHGBuwfn1m62nXLnyuX78whfWKFeHIxeDBYRzCiBGMKwByjdAH0GLr14dLHbfbLky8NH58mMQokxtC1XbIIdJxx0k/+EF6N6oCkBlCH0BObdgQLkdcuDAsN20Ke/lPPRVmqHzyyYY/d8AB4fTAaadJX/86RwGAbCD0ASTKPQxUfPZZ6eKLG+936aXS2WeH+1YAaJmWhj5ThQDICrOwVz9+fPgBsGSJ9NBD4b4WtU2aFPb8zcKja9foltcAcos9fQCxmD1buu++urd9rq1Dh3Ar7P79w90qd9ghXDmw/faxlgkUBA7vAygY69eHaZEfeywM9mtOebn0xBNhauO99mJwIMDhfQAFo317abfdwrn/6upwM6YxY8Jgv4MO2rr/li3hNtj77RcmO+rUKYwL+PDD2EsHChp7+gDy1ooV0tix0qefhjsuNqRbtzDt8KhR4X4Gu+8eb41AEtjTB1B0KirChEIffxwGB27eLE2bFu5iWGPZsjAl8emnhxsWmYUjAt/7Xri0EECEPX0ABemLL6Sbb5YmTw6D/2bMaLzv1VdL++8vHX54uL1yze2OgULFQD4AJW/RonC74uuuC7dDbsr3vy/97GfhKgGg0HB4H0DJ69lTOukkae7ccDrgrrvCPAANue22MB6goiIMErzmGum552ItF4gde/oASoa79JOfhHEB77/feL+vflX6/e+l3r3jqw3IBHv6ANAMM+nnP5fmzZPWrg1HAg48ULroorr9Xn89TBBkJg0ZEm4+BBQD9vQBIOUf/5D23rvx9x9+WDr22DDPAJAk9vQBYBvttVc4BVBdLT366Nbvn3JKuP1wzX0DzKQJE6Q5c6T33ou/XiBThD4A1GMW9uhrfgD8+7833vfGG6WBA6U99wyfmzlTWrkyvlqBTBD6ANAEM+mnPw0/ANylTZvCZEETJ4b3d9yxbv/DDw9XDJiF+wpUV8dfM9AYQh8AMtCqVRjVf8014UfA4sVhOW7c1pP+3HpruDnQuHHSr34lrVkT+gJJIfQBIAvuvz8cBXAPcwC0aRO99+CD0gUXhBsFlZWFowBVVfwAQPwIfQDIsosukjZskO64Qxo2TBoxYus+X/1q+AGwfHns5aGEEfoAkANm0oUXSi+9JD37bNir37AhzP5X2w47hIGAP/5xuKsgkEuEPgDEpG1bafr08APg+uuj1+fMkW64Qdp++/BjYfRo6emnpXXrkqsVxYnQB4AETJggffCB9LWvbf3e00+H4O/QQWrdWrrllvjrQ3Ei9AEgIX37Sk88Ec0HcN99W/fZvFm65JJwBODTT2MvEUWG0AeAPGAmnXlmNB/AypXSuefW7dOrV+i3xx7SO+8kUycKG6EPAHmoc+dwQ6Dqaunkk+u+9/770n77hR8ATzwRBggC6SD0ASCPmUlTp4bwX7RI2nXXuu8fdVS4AdBuu0kLFiRSIgoIoQ8ABcBM6tFDmj8/HP4/9NC673/0Ubgd8OzZiZSHAkHoA0ABmjkzhP+WLXVfHzRIuvjiZGpC/iP0AaCAlZWF8H/66ei1X/4yHBl48EFm/ENdhD4AFIFRo8Ih/trGjQsz/plJs2YlUxfyC6EPAEWiT5+w13/++Vu/V1kpvfgit/otdYQ+ABSZO++Mzvdfc030+vDh4Va/ZtJf/5pcfUgOoQ8ARaqsTJo4McztX9/YsdKxx8ZfE5JF6ANAkRswIOz5r1sX5vyv8Yc/hL1+JvcpHYQ+AJSI9u3D3f3qj+hv31667rowzz+KG6EPACWmoiIM6Dv44Oi1iRPDHf0eeCC5upB7hD4AlCCzMJr/hRekAw6IXj/jjPDe668nVxtyh9AHgBJ2yCHSm29KN99c9/UhQ6S7706mJuQOoQ8A0A9/GAb7vfBC9Nq//uvWPwZQ2Ah9AMCXDjlE+vTT6Pnll0uDB0uffJJcTcgeQh8AUEfPntK8edHzN96QeveW2raVvvgiubqw7Qh9AMBWdt89XMLXsWP02saNUrt20rJlydWFbUPoAwAaVF4urV4dJvUZNSp6vXv3MML/88+Tqw0tQ+gDAJrUvn24de+tt9Z9vaIi/ChA4SD0AQBpGT8+TOpz8snRa507S3/+c3I1ITOxh76Z3WNmL5vZxEberzCzx82syszuirs+AEDjzKSpU+vevvcb35Bmz06uJqQv1tA3s29JKnf3YZL6mVn/BrqNk/SQu1dK6mRmlXHWCABo3p131r2mf9AgafHi5OpBeuLe0x8haVqqPV3S8Ab6fCZpfzPrKqm3pAXxlAYAyMQhh0i33BI979kzuVqQnrhDv4Okhan2ckk9GujzgqRdJY2X9G6qXx1mdm7q8H/V0qVLc1UrAKAZF18sXXhh9NwszOyH/BR36K+R1D7V7tjI9n8m6Xx3v1rS3yV9p34Hd5/i7pXuXtm9e/ecFQsAaN4dd0g77xw932mn5GpB0+IO/VmKDukPkDS/gT4Vkg4ws3JJB0niNyMA5LkFtU7ELl4c9vg3bkyuHjQs7tB/VNI4M5sk6SRJb5vZtfX6XC9piqSVkraX9HC8JQIAMmUWLucbMiR6rW3b5OpBw2INfXdfpTCY7xVJI919rrtPrNfnNXffz907uvuR7r4mzhoBAC1jJr36qnTCCdFrq1YlVw+2Fvt1+u6+wt2nufuiuLcNAMi9Rx6J2l26SC++mFwtqIsZ+QAAWXfTTVF7+HBG9OcLQh8AkHWXXy49+WT0vKws3LgHySL0AQA5MXq0dMkl0fMOHaRNm5KrB4Q+ACCHJk2SLr00et6mTXK1gNAHAOTYf/6n9MMfRs9r36wH8SL0AQA5d/PNUfuuu8LlfevXJ1dPqSL0AQCxeO+9us+32y6ZOkoZoQ8AiMUee4RL9wYMiF7r3JnL+eJE6AMAYjVrVtRevVo69dTkaik1hD4AIFbl5WGe/hpTp0onnZRcPaWE0AcAxM5MWrgwev7II9KzzyZXT6kg9AEAiejVq+7td0eNkj7+OLl6SgGhDwBITOvW0htvRM933bXu9L3ILkIfAJCogQOl3/0uej5mjNS3b3L1FDNCHwCQuOOPl156KXo+f34474/sIvQBAHlh2LCtb8hD8GcXoQ8AyButWoXJerp1i17bZZfk6ik2hD4AIO8sXRq1Fy7cegpftAyhDwDISxs2RO0990yujmJC6AMA8lLbttKdd0bPb7stuVqKBaEPAMhb558ftcePT66OYkHoAwDy2uLFUXvu3OTqKAaEPgAgr+24o7TDDqE9ZkyytRQ6Qh8AkPeOPz4slywJl/ShZQh9AEDe+9GPonZlZXJ1FDpCHwCQ9/r1k4YODe033pC2bEm2nkJF6AMACkLtufnPOy+5OgoZoQ8AKAhm4da7knTPPVJ1dbL1FCJCHwBQMF5/PWp/97vJ1VGoCH0AQMHo3l36yldC+9e/rjtVL5pH6AMACsr06VH7gAOSq6MQEfoAgILSo4d0xRWhPW+e9MwzydZTSAh9AEDBue66qH3EEcnVUWgIfQBAQao9Yc/SpcnVUUgIfQBAQbr66qi9447J1VFICH0AQEFq00a64ILo+dFHJ1dLoSD0AQAF6447ovaf/iQtWJBcLYWA0AcAFCyzujPz9ekjbd6cXD35jtAHABQ0M+npp6PnrVsnV0u+I/QBAAVv1Cjphhui53/7W3K15DNCHwBQFGpfwnfQQcnVkc8IfQBA0bjxxrBcv15avDjZWvIRoQ8AKBqXXRa1Bw9Oro58RegDAIpGWZk0blxoL1zIXfjqI/QBAEXl17+O2jNmJFdHPiL0AQBFxUzaZ5/QHjs22VryDaEPACg6DzwQtd95J7k68g2hDwAoOrUH8Q0dmlwd+YbQBwAUpfHjw3L16mTryCeEPgCgKF1ySdR+9dXk6sgnhD4AoCjttlvUPu+8xMrIK4Q+AKBonXNOWM6dW/dufKWK0AcAFK1Jk6L2Y48lV0e+IPQBAEWrU6eofe+9ydWRLwh9AEBRO+ussPzTnxItIy8Q+gCAonb++VG71CfqiT30zeweM3vZzCY202+ymR0dV10AgOI0ZEjUfuqp5OrIB7GGvpl9S1K5uw+T1M/M+jfS71BJPd39j3HWBwAoPmbRIf6LL060lMTFvac/QtK0VHu6pOH1O5hZa0n/JWm+mR0bX2kAgGI1enTUdk+ujqTFHfodJC1MtZdL6tFAnzMkvSPpJklDzOz79TuY2blmVmVmVUuXLs1ZsQCA4vDtb0ftm25Kro6kxR36ayS1T7U7NrL9gZKmuPsiSQ9KGlm/g7tPcfdKd6/s3r17zooFABSH8vKoPWFCcnUkLe7Qn6XokP4ASfMb6DNPUr9Uu1LSR7kvCwBQ7G65JekKkhd36D8qaZyZTZJ0kqS3zezaen3ukTTSzGZKulDSzTHXCAAoQmefHbWvvDK5OpJkHvOIBjOrkHSkpJmpQ/jbpLKy0quqqra9MABA0dtxR6lmKNjmzXUP+xcSM5vl7pWZfi726/TdfYW7T8tG4AMAkInat9i9/fbk6kgKM/IBAEpG377SPvuE9o03JltLEgh9AEBJufzysPz00+hQf6kg9AEAJeWss6QeqVliBg9OtJTYEfoAgJJiJh12WGgvWJBsLXEj9AEAJee666L24YcnV0fcCH0AQMnpX+t2bzNnSv/8Z3K1xInQBwCUpI0bo3apzNZH6AMASlLr1tKpp4b2pEnJ1hIXQh8AULLGjAnLLVukzz9PtpY4EPoAgJJ12mlRe9q05OqIC6EPAChZrVpJxx4b2uedl2wtcSD0AQAlbdSoqL1kSXJ1xIHQBwCUtO99L2rXzNRXrLIe+mbWPtvrBAAgV8rLpeuvj54vXpxcLbnWbOibWRszOzTVLjezo5v5yDVmdnVWqgMAIAYTJkTtsWOTqyPX0tnT317SU6l2K0lTm+m/k6Su21IUAABxO/74sJwzJ9k6cimd0P8i9ZC7fyFpc+03zewhM+tS66WdJL2ZtQoBAIjB1bWOUbsnV0cupRP61ZK2mNl/mdlqSR3NbIWZrTazIyWdIuktM/tqqv8ASS/nqF4AAHJi772jdrGe189kIN+tko6VtFbSNyXNSX1+paQrJT1hZpdLWu/ub2e7UAAAcqmsTOrXL7RvuinZWnIlndA/XJK7+1vu/oykze4+Q9Ky1Pvu7vdJOlPS9ZJ+k5NKAQDIsYqKsPzFL5KtI1eaDH0z+x9Jj6a5roNSy7bbVBEAAAk5//ykK8it5vb0b5c0QpLMbJiZfUdSGzM7Q1LvVJ9WZna3pBMlHSHpBDOzHNULAEDOnH561J49O7k6cqXJ0E8dzp8ryRTC/wcKe/I/lLSdpA2SOqbeH5I67L9Q0mG5KxkAgNxo1y5qf/e7ydWRK+kO5HN3v17SQEnr3H2Au++rMEp/nbuf7e6rUn2fkzQs+6UCAJB7NYf4i/F6/Uyn4W0nqfY0uybpt/X6vCVp8LYUBQBAUi65JGq/+GJydeRCqzT7tTWzi1LtH5jZOZLWSfpU0k1m1tHd16Tef1/SI1muEwCAWOy5Z9Q+/XTpww+TqyXb0gn9LZL+Luk0STVzFLWS1CH16CmptZn9n6Tpku5192k5qBUAgFhcdVV4zJ+fcCFZ1uzhfXdf4+6D3X2Yux+cegxx9/3cfTd3byepr6QbJe0l6Q0zOyTXhQMAkCvHHBO1585Nro5sy/jWumbW3cy61X7N3T929/vcfaykAe5eZGdBAACl5MADo/bJJydXR7alc2vd9mb2QwvaSfpXSWc01t/d38pmgQAAxM1MGj8+tBcsSLaWbEp3T/8SSftLmqxwbf5GM5tlZp+Y2Qf1Hv8ws6tyVTAAAHG44oqwXLdO2ry56b6FIp1z+uslbVII+w0Kt9bdJKlCYXBfe0nfqbV8S9JlZlaeo5oBAMi5Hj2kVqnh7sVy6V5zc+8fZWYjFWbhq5TUQ9IeNe+nZuBbn1puSC3/U9IxCrfkBQCgYNXs4f/qV8nWkS3N7ek/IOl+Sd0l3SRptKRTm/qAu7/k7s+4uzfVDwCAfHfEEWE5dWqydWRLc3Pvd3P33pI+UZh7/35J1zTWPbulAQCQrGuvjdpvvJFcHdnS7OQ8qXPzrRR+ILRRmHq3LLxlP5VUUW8pSXL3q3NTMgAA8Rg6NGrff780aFBytWRDOqP326UeayW9lmq3UZhzv4fCKYAKhaMA3VKv9clFsQAAxO2UU8Ly1luTrSMbmt3Td/e1ZnahpI3ufo+ZnSjpA3efZWZnS9rd3a/IeaUAACTgO9+RHn44tDdulNq0SbaebZHudfqnSJpnZt+WNFXSO2Z2n6QJkp7OUW0AACRu9OioXRP+hcqaGmRvZicrXJsvhdvluqSJko5XGNj3hqTP632sXOESv0fcfUuW691KZWWlV1VV5XozAIAStsMO0vLlUrt20vr1SVcjmdksd6/M9HPNHd6/StIXCmHvCoP4TNLvU++/L2lN6rXa62wr6U+p9wAAKGhXXCFddpm0YYP05JPSkUcmXVHLNHfJ3j7ufqCkwyS9LOlHCuF/gqTHJXWV9LCkSncfmHoc4O57ujuBDwAoChddFLWvaezC9QKQ7jn9aQqj8t9R2Kv/q7sfLelfJJ0s6UUzsyY+DwBAwWrbVnrggdB+/vkwH38hSjf0z3L3E9z9E0l93X2dJLl7laShki5lBj4AQDE75pio/bvfJVfHtkgr9N19ca32R/Xe2+zuL2W7MAAA8knnzlLv3qH9ySfJ1tJS6e7pAwBQ8r75zbC88cZk62gpQh8AgDT16hWWBx+cbB0tRegDAJCmIUPC8oknkq2jpQh9AADS1KlTWHbokGwdLUXoAwCQpt12C8u1a8Oj0BD6AACkqVu3qD1hQnJ1tBShDwBAmsyiKXhvvz3ZWlqC0AcAIAOlMA0vAACQNGBA1N68Obk6WoLQBwAgA+3aRe0vvkiujpYg9AEAyFDXrmG5cmWydWQq9tA3s3vM7GUzm9hMvx5mNjuuugAASNfnn4flvfcmW0emYg19M/uWpHJ3Hyapn5n1b6L7zZLax1MZAADpqzmvf+WVydaRqbj39EdImpZqT5c0vKFOZjZK0lpJi+IpCwCA9E2aFLUL6Ta7cYd+B0kLU+3lknrU72BmbSRdKanRaQ/M7FwzqzKzqqVLl+akUAAAGjNqVNS+++7k6shU3KG/RtEh+46NbH+CpMnu/nljK3H3Ke5e6e6V3bt3z0GZAAA07Sc/CcuXXkq2jkzEHfqzFB3SHyBpfgN9Rkv6npk9J+lAMyug31AAgFIxenRYrl6dbB2ZiDv0H5U0zswmSTpJ0ttmdm3tDu5+mLuPcPcRkua4+zkx1wgAQLMGDYrahTKgL9bQd/dVCoP5XpE00t3nunujl+6lgh8AgLzTuXPUnj49uToyEft1+u6+wt2nuTsj8wEABe2//zssX3tNck+2lnQwIx8AAC00ZkzU/s1vkqsjXYQ+AAAt1KuX1D51TdrppydbSzoIfQAAtkHt6/SvuiqxMtJiXggnIZpQWVnpVVVVSZcBAChhZlE7jlg1s1nuXpnp59jTBwBgG330UdR+/vnk6mgOoQ8AwDbq0ydqH3ZYcnU0h9AHACALnnwyar/4YnJ1NIXQBwAgC2qm5ZWiefnzDaEPAECWnHlmWM6YkWwdjSH0AQDIkosvjtorVyZXR2MIfQAAsmTgwKj9s58lV0djCH0AALJo3Liw/PDDZOtoCKEPAEAWff3rYfmHPyRbR0MIfQAAsuiII6L27NnJ1dEQQh8AgCzq1i1q1752Px8Q+gAAZNk3vxmWP/pRsnXUR+gDAJBll14atfPpvnaEPgAAWTZ8eNSeOjW5Ouoj9AEAyDIzqVOn0P63f0u2ltoIfQAAcuCmm8Lyk0+SraM2Qh8AgBw44YSo/d57ydVRG6EPAEAO1L50L18m6iH0AQDIkTFjwnLWrGTrqEHoAwCQI7vsknQFdRH6AADkyKhRYfnww1J1dbK1SIQ+AAA5c9RRUfuPf0yujhqEPgAAObL99lH74YeTq6MGoQ8AQA6NGxeW776bbB0SoQ8AQE4df3xYvvlm8vPwE/oAAOTQ4YdH7Q8/TK4OidAHACCnunaVdt89tOfNS7YWQh8AgBxbsqTuMimEPgAAOfYv/xKWNYP6kkLoAwCQY717J11BQOgDAJBjF1wQtZMcwU/oAwCQY337Ru3HHkuuDkIfAIAcMwuj+CXpuOOSq4PQBwAgBj//edIVEPoAAMTitNOi9saNydRA6AMAEIPOnaP2pEnJ1EDoAwAQk698JSx//ONktk/oAwAQkyuuiNqbNsW/fUIfAICYnHhi1J4zJ/7tE/oAAMSkrEwaPDi0b701ge3Hv0kAAEpXp05h+dBD8W+b0AcAIEaXXRa1t2yJd9uEPgAAMaq5454kvfNOvNsm9AEAiJFZOLcvSWecEe+2CX0AAGJ2+ulhGfcIfkIfAICY3X571F6xIr7tEvoAAMSsZgS/JD3xRHzbJfQBAEhAzXn9V16JcZvxbQoAANSoGcQX53S8hD4AAAnYeeewjPOyPUIfAIAEdOsWljNmxLdNQh8AgAQcfHDUjiv4CX0AABIwZEi0t3/11fFsM/bQN7N7zOxlM5vYyPtdzOwvZjbdzP7XzNrEXZ2ZqXkAAAlpSURBVCMAAHE47bSwfOaZeLYXa+ib2bcklbv7MEn9zKx/A91OkzTJ3cdIWiRpbJw1AgAQlxNPjHd7reLdnEZImpZqT5c0XNJ7tTu4++RaT7tLWhJLZQAAxGzIkKi9dq3UoUNutxf34f0Okham2ssl9Wiso5kNk1Th7ltNW2Bm55pZlZlVLV26NDeVAgCQY61bS+Xlof3uu7nfXtyhv0ZS+1S7Y2PbN7PtJd0m6bsNve/uU9y90t0ru3fvnpNCAQCIw5YtYXn33bnfVtyhP0vhkL4kDZA0v36H1MC9RyT92N0/iq80AADiNzY1cu2uu3K/rbhD/1FJ48xskqSTJL1tZtfW63O2pEGSfmJmz5nZyTHXCABAbK68MmrX7PXnSqyh7+6rFAbzvSJppLvPdfeJ9frc6e4V7j4i9fhtnDUCABCnYcOi9n/8R263Fffofbn7CkUj+AEAKGlmYUDfpk3S3Lm53RYz8gEAkLAbbgjLf/4zt9sh9AEASFivXmH5+uu53Q6hDwBAwvbZJyzXr5eWL8/ddgh9AAASdsABUfvSS3O3HUIfAICElZVJhx4a2rm8bI/QBwAgD5xxRlg++GDutkHoAwCQB/r2jdoLFzbeb1sQ+gAA5IGRI6P2OefkZhuEPgAAeaCsTPrGN0L7iSdytI3crBYAAGRq0qSo/X//l/31E/oAAOSJ/v2jdi5m5yP0AQDII1/7WlguWZL9dRP6AADkkY0bwzIXk/QQ+gAA5JFBg8Jy4ULJPbvrJvQBAMgjV10VtX/72+yum9AHACCPdOwo9esX2qeckt11E/oAAOSZqVNzs15CHwCAPFNZGbWHDs3eegl9AADyjJk0dmxov/pq9tZL6AMAkIcefzxqz5iRnXUS+gAA5CEzqbw8tEeMyM46CX0AAPLUZZdld32EPgAAeeoHP4ja2RjRT+gDAJCnevaM2rffvu3rI/QBAMhjNXv4L74offTRtq2L0AcAII8dd1zUPvXUbVsXoQ8AQB5r00b61a9C+6WXpE8+afm6CH0AAPLcOedE7d69W74eQh8AgDxXXi5Nnrzt6yH0AQAoABdcII0fv23rIPQBACgQt97KOX0AAErGzju3/LOEPgAAJYLQBwCgRBD6AACUCEIfAIASQegDAFAiCH0AAEoEoQ8AQIkg9AEAKBGEPgAAJYLQBwCgRBD6AACUCEIfAIASQegDAFAiCH0AAEoEoQ8AQIkg9AEAKBGEPgAAJYLQBwCgRBD6AACUCEIfAIASQegDAFAiCH0AAEoEoQ8AQIkg9AEAKBGxh76Z3WNmL5vZxG3pAwAAMhNr6JvZtySVu/swSf3MrH9L+gAAgMzFvac/QtK0VHu6pOEt7AMAADLUKubtdZC0MNVeLmlQS/qY2bmSzk09/cLM3spyndhaN0nLki6iyPEd5x7fce7xHcdjr5Z8KO7QXyOpfardUQ0faWi2j7tPkTRFksysyt0rs18qauN7zj2+49zjO849vuN4mFlVSz4X9+H9WYoO1w+QNL+FfQAAQIbi3tN/VNLzZtZL0lGSvm1m17r7xCb6DI25RgAAilKse/ruvkphoN4rkka6+9x6gd9Qn5XNrHZKDkrF1viec4/vOPf4jnOP7zgeLfqezd2zXQgAAMhDzMgHAECJKJjQZya/3Gvu+zOzLmb2FzObbmb/a2Zt4q6xGKT7d2pmPcxsdlx1FZMMvuPJZnZ0XHUVkzT+f1FhZo+bWZWZ3RV3fcUi9f+B55vpk3b2FUToM5Nf7qX5/Z0maZK7j5G0SNLYOGssBhn+nd6s6PJVpCnd79jMDpXU093/GGuBRSDN73icpIdSl+91MjMu48uQmVVI+rXC/DWN9cko+woi9MVMfnEYoWa+P3ef7O5Ppp52l7QkntKKygil8XdqZqMkrVX4cYXMjFAz37GZtZb0X5Lmm9mx8ZVWNEao+b/jzyTtb2ZdJfWWtCCe0orKFkknS1rVRJ8RyiD7CiX068/S16OFfdC4tL8/MxsmqcLdX4mjsCLT7PecOm1ypaQJMdZVTNL5Wz5D0juSbpI0xMy+H1NtxSKd7/gFSbtKGi/p3VQ/ZMDdV6VxBVtG2VcooZ+VmfzQpLS+PzPbXtJtkr4bU13FJp3veYKkye7+eWxVFZd0vuOBkqa4+yJJD0oaGVNtxSKd7/hnks5396sl/V3Sd2KqrdRklH2FEozM5Jd7zX5/qT3QRyT92N0/iq+0opLO3+loSd8zs+ckHWhmd8dTWtFI5zueJ6lfql0pib/nzKTzHVdIOsDMyiUdJInrw3Mjo+wriOv0zayzpOclPa3UTH6STqw9sU8DfYamcVgEKWl+xxdI+rmkuamX7nT338ZdayFL53uu1/85dx8RX4WFL82/5U6S7lU4FNpa0gnuvrCB1aEBaX7HQyT9t8Ih/pclHefuaxIot+DV/H/AzPaVdOq2ZF9BhL705SjGIyXNTB2Sa1EfNI7vLx58z7nHd5x7fMf5I5P/FgUT+gAAYNsUyjl9AACwjQh9AABKBKEPQGbWITXKGkARI/QBSOFa381m5mk87q35kJkdluZnaj96J/jvBEpaq6QLAJAX+kj6QtLG1PN5kiZJmlyv33OSPq31fFNqWZHmNubW+gyAmBH6AOTuX86LbmZflbSDpD/WnxXQzHaS9HGtlzanPt/s7IGpOdi//AyA+HF4H0B9P5X0grv/rfaLZtZO4UZL79d6eVO9PssaOJz/er31E/pAQgh9AJK+HMx3v6RRki6s9fr2qbv+/bvCVKpvNrGadZJGuru5u0m6RNL6HJYNIAMc3gdKnJntIukkhYCulvS1env5WyT9VWGw33Xu3tQtlavTfA1AAgh9oISZWVuFe3CXKdxm9m53r7Nn7u4rzaynu3+WzirTfA1AAji8D5Qwd/9C4QYde0s6VtK6hi6zk1T7XP2pTayynaRna33uF6nXAOQB9vSBEufuq1LNdZJ+L+myJrq/KWlDE+/vqa337Bm4B+QJQh9AjWpJa9x9fmMdzKxaTZyj53bWQH7j8D6AbdGSHQem+wUSwp4+gNrONLMzm+lT+/8brSUpdf4+Xa0zrgpAVrCnD6CGS3pQYUrdxh6rVHdgXitJK2uuy2/qIalvrc8ASIC5Z/IDHQAiZtZKUod0zuWbWZmkzgo/EvgfD5AAQh8AgBLB4X0AAEoEoQ8AQIkg9AEAKBGEPgAAJYLQBwCgRBD6AACUiP8HED/OitHRbOcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7620188195038494"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#，目标设定为90%精度，阈值在30000左右\n",
    "y_train_pred_90=(y_scores>3000)\n",
    "precision_score(y_train_5,y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.821619627375023"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ROC 曲线\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "#假正类，真正类，阀值\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9634925295707945"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC分数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
      "  from numpy.core.umath_tests import inner1d\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0.8, 0.8, ..., 0. , 0. , 0.6])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为决策值：\n",
    "y_scores_forest=y_probas_forest[:,1]\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)\n",
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAF6CAYAAAATeYHoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3wU1f7G8c9JSAKE3ouoKChFDEJARQUkUlQsqDTpioK9ICoKgoiIF8UuXlQEUUSsqCgiRX42SgADqKgXUZCOYIAQSNnz++MkJISEBEh2ksnzfr327u7s7Myz3LjfPWfOnDHWWkRERMT/QrwOICIiIsGhoi8iIlJMqOiLiIgUEyr6IiIixYSKvoiISDGhoi8iIlJMqOiLiIgUE0Ev+saY6saYb3JZ53VjzA/GmOHByiUiIuJ3QS36xpiKwFQg8ijrXAOEWmvPB04zxtQPVj4RERE/C3ZLPxXoDuw5yjptgZlpj+cCFxZwJhERkWKhRDB3Zq3dA2CMOdpqkcCmtMe7gGZZVzDG3AzcDBAZGdm8QYMG+RtUgsoe+p/0O5vDcvfgsHUyzSKd4zrZbQd76L2HTURts6yT7Xsz79dms9/DP5c9bIs5bS/LOtluz+aSJdO+sr43y4e0eV3niO1nzp/L58rus2e732zWETkaC5nLiPsTMoSkNWMNEAi45SEh7mYwBAKQkuqeh6VVv0AAkpPd9kpGmEMbSEx07y9dyr1mDBw4ACkphlIloUQJtywpyS0PD4dSJd17A6mGvXshJBTKl8vIuXuX+xuvXCmjDu7Z47ZRqRKEhrrs+xNdptKlDOHh7r0HE5P4d/vfpCYnUrpcRfbv2b3TWlv1WP/pglr082gfUCrtcRmy6Y2w1k4CJgFER0fb2NjY4KUrhFJSA+zen8w/CQf5Z18SO/e5+4znSRxMSSVgrfsPAUvAui/bgMUtP/TcrRNI+yIOZFrHHlo3bTvp78tue4HM66e9n8PXKY6XfTA5PJYjGQMhxhBi3BdkyKHn5tBreVkn/bXMz93rmdc/cp3ctpfbOiHGQB72mfG+o68TYtKLj+FAogELZcoYQkPcuvv2wb69hsqVDZGl3bKdO2DjRkP1alD3VFcUN24wzJ9vOPUU6NA+Yx/T3oSkJMONN0BEhNvn++/BksWG226DM+q7dRcvNnwyC+66y3ByHbds4wZDly7Qto3h+efTPgfQqJGhVElD3I9QItR9zh7dDYsXw3szDRdc4NZ9cpxhwtMwbJjhgfvdsoULDVdeARdfDHO+cHn2xEOlSu5z/O9/ULeu+1s580z47TdYu9Y9BrjxRpg8GV59FQYOdMumToX+/aF3b5g2zS3bvdsV3AsugG+/zfj7u+46+OcfePddqFbNLfvvf2HZMmjb1m0DYOlSmD0bWrSAzp0ztvnhh1C5Mlx9dcY2166FsDA47bTDf7TkJiEhgdNOO43IUmFMmvYG3bt3xxjz1zH853SI8eKCO8aYr621bXN4rS9QzVr7lDHmUeBXa+30nLblx6JvrWXvwRRXuPcdZGemAv7PvoPsTHD3rrAnsXt/UpEtoId9kZLdFzOEhJjDvgANWb4QQ3L4Ys68vZCjfNGT+zrp2wsJOfxLOLsvemNyLwYZBSZvX/S5rZN9gcnYf06FKqd1QkLcv0uOnyMkh3/Dw/4/O3If6euZkNyzFmapqa6FBlCxYsbylSth2zbo1Clj2ZIlbtm550L16m7ZL7/AU09Bv37QurXb3vvvu0I1dCiMHOnW+/13aNwYTj/dvSddjRpum5s3Q82ablnDhq6ovPMO9Ojhlj3/PNx1F9x+O7zwglv25Zcu3xlnwK+/ZmyzXDnYuxfi491jcEVs9mx45hm4+2637JVX4MEH3f7uvx+6dIE1a6BJE/d65u+iatVgxw7Xmk7/v/TGGyE21hXjli3dsrffhhkz4PrroWfPjH+j555z+7nrroxt3ncf7NoFEyZAhQpuWWysaxk3bQql0pqMu3a51nqFChCZNoosEHD3IUXkvLXk5GTCwsIAmDlzJi1atKBu2i8dY8xya230sW7T05a+MaYRcL21NvMo/Y+Bb4wxtYBLgfM8CZfPDiSnsishybW8MxXwfxKObJn/sy+JpNRAnrdtDFSKDKdyZDiVy4RTuUwEVSLdfeUybnnp8BLZtI5ybq3kyzrpRZSjF0eR3OzeDSkp7gs87TuQvXvdrWxZdwPXTbp1q1snvRgGArBihXvtvPMyvvDfeQc2bYJevTLW/fhjmD8frroKLrnELXv7bXj4YejTBx57zC2Li4PmzV2RWbkyI+d557n9JCZCyZJu2aOPwhdfwGefweWXu2WvveZaoSEhrugbAyedBAkJMHMmjBiR0S2dnOy2mVnlyocXUnCZ166F8uUzlp1xBlx7rcuZLioKbrgho+Cme/JJt6+IiIxl99zjWtqZf8RceimcfLL7N2/Vyi2rX98V/ipVDt/m9u0c4fXXj1zWq5e7ZdawofuBkdVTTx25LDqb0lep0pHLikqxB1i9ejU9evRg1KhRdO3alW7duuXLdj0p+umtfGvtz8DwLK/tMca0BdoD/7HWxgc9YB6kBiz/7k86vGgfKuIZj9Nb5HsPphzT9iPDQzMV7QiqlAk/9LhymXCqZHqtYukwSoQWob9m8bXt2+Hnn13BqVXLLVuxwrUYzzknowt03jx4/HFXhJ591i2z1rWc4+MPbzFeconbxrJlGV/wTz/tCuojj7h7gNWr3evNmsHy5W7ZkiWuIO7YAfv3Z7QEn3vOvXbhhRlF/7vv4MUXoU6djKIfEQF//QWzZmUU/YgIV1zLlDn8s59/vivcK1e6x+Ba+CVKZHQRA3Ts6LaZXiRDQlxrfvJk102cXpzq1nXHi0NDD9/PTz8d+e8+bpy7Zdap0+EFG1wvQXaF95ZbjlwWE+NumZ1yirtlFhHheiTkxFlreeWVV7j33nupUKEClbL79XICCuMxfay1u8kYwR80yakBNv+beETR3pnWjf5Pphb5roQkAsfQpV4ixBxZtDO1xqtkeq1yZASlwkNz36hIGptlYNPWra51WKMGhwYCbdgAW7bAqadmdDOvX+8KXd267pgmuIJy//3QoIErrOmiolxre9WqjCI0eDB89ZU71pleJAcOhE8/de+99163bPlyV5wHDswo+pUrw9dfu27c9KJvjGslgztWmt4arVjRFcjMxa9sWff5Mhfe8HBXsNM/H2QU3wYNXDd6up493WfOvO5VV7lWbPq/BUCbNu7zZC5qjRvDv/9yhK+/PnJZeld9Zh06uFtmNWrAgAGHLwsJObzlLf62a9cubrrpJj788EM6derE1KlTqZb512I+KJRFP9gCAcuHKzfx5Jy17Nh7MM/vq1A67FDhPqxoZ+lerxIZQblSJdSVLdlKTHQFpEQJqJo2Fvfvv2HxYtcCTS9Av/0GDzzgWoTpXZz797vjlVWrHt6V2r69625dtcoda7UW+vaFRYvgpZfg1lvdejNnuuOzV17pWrLgWtmff+661DNbsyZjRHS6rVvhjz9g376MZR06wA8/HF5gzznHdZFn7oatXx9efhnOPvvw/fz0kyt0J52UsWzevCP/3YYMcbfMmjRxP26yyq6bOfNx4nQXXuhumVWtmvFDRaQgzZs3j08++YSnnnqKe+65h5ACOB5R7Iv+mk3xPDJrDSs2uJ/t1ctFUKN8qbSinVa4Iw/vTq9SJpyKkeGEqUu9WLLWDRKqXNk937PHDZIqWfLwInTNNW69Tz7JGBh12WWuNfjFF64FuX69axG/9JLrmh0yxBX/JUuga1e3jfSiHx/vjjk3b56xj/Tjxjt2HJ6xRg33QyK9ZWwMXHGFK/pVM53k066dG0l8XqaRMw0buuPPWXsVf/zRbSdza/vll90PkBo1Mpbdfru7ZRYdfeRx1zJlsu9SrlfvyGUifpWamkpcXBzNmjWjW7duREdHc9pppxXY/opt0d+VkMT4L39lxrINWAtVy0Yw7NIGdDmntlrkPpaa6rqiExLcSOHatd3y1193x3jHj3fHW8GdqvPAA674jh/vlm3Z4o5Tn3sufP+9635NSIDhw103ceai/+23rhgnJmYU/YMH3fPkZPe8bt2MFu2uXW409sknuy7qa691+0lXrx588EHGjw1w+9+06fDjxeC63LPKrmXcogWsW3f4sooVMwacZZY+Ojuz9GP2InLsNm3aRO/evVm8eDG//vorJ598coEWfCiGRT81YJm+5C+emvsb8YnJlAgxDLjwVO6MqU/ZkmFex5M82rHDtbBPPTWj5fnWW65wf/NNRgu4Wzd47z3XNd24seuynjnTtXjPOy+j6K9d6waBLV6cUfT373eDrXbuzNhv+r6WLHFd2uXKuduwYYePmga3H2szTisCd2zY2ox84LrXH3zw8Pe2bOlO4cqsYkXX8s9KhVek6Pnss8/o378/iYmJTJw4kTp16gRlv8Wq6C/7cxcjZ/3Ez1vcCbYX1qvCqCsbUa9aWY+TSbr01m7jxq4red8+d6pUWBhMmQKlS7tjtumjh3ftyjhP+u673WQaixZlFO70bu85c9w2q1Rx5xWXLXt4sezWzR0rb906Y9l117nTlTIPFKtSxR0frlIlY+BcZCSMHXvkZ2nb9shlpUsfz7+KiPiFtZZ7772XZ599lqZNmzJjxgzOTJ9RKAg8mZwnP+Vlcp7tew7wxBdr+Wilm923doVSDL+8IZ3OqqGu/CBKTDx84ozhw93x62efdd3UixdnjLQ+eNCNxP7zTzeietUqN2gsfaR1o0Zu1PeOHRmnPU2Y4AaQ3XCDO5cY3A+IlBQ3IC5MHTkiUgjcd999JCcn8+STT1Iyc7ffMTjeyXl8XfSTUgJM+X49z837nYSkVMJLhDC4zenc0uZ0nRKXT3bvdsW4YUP3fM8eN8lGiRLw0UcZ66X/tkqfUOSPP9zx6p07M1rr1rrBY//+6yZdSW9hv/KKm3Jz9Gi1lEWk6LHW8uabb1K/fn1atWqFtfaEG5xFcka+grRmUzx3zVjJuh0JAFzSsDqPdG7EyZVVNfIq87nf27a5gW8tWmRMAPL2227+6Vq1XIs8LMwNlPvsM/cj4J9/MgadlS/vRp//8IObxeu001yX+j//ZBzfNsY9z3qWyuDBQfm4IiL5bu/evdxyyy28/fbb9OnTh1atWnnaw+zLlr61lo7P/h+/bdtH3SqRPHJFIy4+M38nOPATa92sX+ld75s3u+PbjRu7Oa3BzdHdoIEr0OmTp6RfwQoyBsolJ7sBdaVLuwtNpE8skpp65KxiIiJ+FhsbS48ePVi/fj2PPvoow4YNIzSfvgjV0s8k9q/d/LZtH1XKRPDFXRdRMkzVJt2ePW460zZtXMv6yy/d6Vmpqe7Yd2io62JPTXWzqO3f7wr4KafAE08cPhLdmMOnNQXX2s86qxio4ItI8bJ06VIuvPBCatSowaJFi7gw66xPHvFl0Z++xE3J1b3FScW+4O/c6UaXlyrlWuaNGrnzurdtc+d2x8S41vj+/a4FX6aMa83PmuXmTk8/hl6y5JGnlcHhBV9EpLgLBAKEhITQvHlzhg8fzu23357v8+efCN9NKbcrIYnZq7e46za3ONnrOJ6x1o1gr1rVTRKTnOxa5umTvWzb5u5LlHCD6qw9/NS0Sy91XfwiIpI38+bNo2nTpmzevJnQ0FAeeeSRQlXwwYdF/4Plf5OUEqDNGVWpU6l4DdqbPt11wYPrqu/d2z2+446M4/DTp7sCn3l2tcwXHBERkWOTnJzMsGHD6NChAykpKezZs8frSDnyVdG31jJ9qeva73XuKbmsXbRt2eIuw5k++cy6de5UubFj3bKwMHfVs/nz3fns6dPA6opdIiL5Z/369Vx00UWMGzeOgQMHEhsbS4MGDbyOlSNfHdP/Yd0/rN+ZQM3yJbn4zKq5v6GIsNYdm09NdRc2WbfODcTbtMldgOWqq1xX/JVXuulk04+zV6+uVryISEEaPXo0a9eu5d1336Vbt25ex8mVr1r6by9NH8BXhxJF9Ap4+/fDsmXuGufppkxxg+5uusk9P/1099gYd+WzdLNmuVPrMh+bFxGR/LV//37+/vtvAJ555hlWrlxZJAo++Kjo79h7kC/XbCU0xBSpAXwHD7prlwcC7tahg7vYyk03udcg4/j7X39lvG/kSLf+yJHBzywiUlytXr2a6OhounTpQiAQoEKFCtStW9frWHnmm6I/M3YjKQFLTINq1Ch/fHMZB9v+/e7898svd9POhoS4K8SNGpVx6VVw1yG31s0/LyIiwWetZeLEibRo0YLdu3fzxBNPEJJ1+tAioOglzkYgYJmxLG0A33mFewDfJ5/AO++4xwcOwD33uMd//OHujXGt999/16A7EZHCID4+nmuvvZZbb72Viy++mLi4OC655BKvYx0XXxT9zfGJbNyVSOXIcC6qV8XrODmaOdMNuhs3zp1SV6mSuz76okVwzjlepxMRkeyEh4fz119/8dRTTzF79myqVSu607r7o+j/ewCAkyuXJiSk8Fwq94EH3Ax4mze75127utb7qlUZc9bXr3/4NdxFRMR7qampPPfcc+zdu5dSpUqxZMkShgwZUiS79DMr2unTbIl3M8/UKu/9nLDpx+JTU2H2bHeO/DXXuK789LnqM1+oRkRECpe///6bmJgY7r77bqZPnw5AiRL+OMPdF6UnvaVf08MBfLt3u6vQhYe7Ah8SAqtXwyOPwMsvZ1w+VsVeRKTw+vTTT2natCmxsbFMmTKFm2++2etI+coXJSi9pV+zgnctfWOgeXP3+PHHM5Y9+ig0a+ZZLBERyaOXXnqJK6+8kpNPPpnly5fTr18/jCk8h4zzgy/6K9Jb+rWC3NL/8EPXqr/+enfJ2Xvugcsug+7dXcEXEZGio3PnzmzYsIHRo0cT4dPTp9TSP06BgJv7vlcvuPhityw62j33yaEfERFfs9YyZcoUunfvTiAQ4JRTTuHJJ5/0bcEH3xT94LX0Dx50g/VCQtxo/EaNYMKEAt+tiIjkoz179tC7d28GDBjA9u3b2bdvn9eRgqLIF31rYVdCEmGhhiplCvbX2XffuQF5S5a4/fbrBz/9pHPsRUSKkmXLltGsWTPeffddHnvsMebNm0e59EuR+lyR74hOSg0AUL1cyQI/R3/3bnffvz/89puO24uIFDXJycl069aNQCDAokWLuOCCC7yOFFRFvqWfnFb0C+oc/fh416oHN0ivXz/X0tepdyIiRceOHTtISUkhLCyMjz76iB9//LHYFXzwUdGvWSH/j+e/+KIblf/00xkXxJkyBSpXzvddiYhIAfnqq69o0qQJo0ePBqBp06ZUrFjR41Te8EHRd83wmgXQ0r/ySnc/fLgbrS8iIkVHcnIyDz74IB07dqRSpUp07drV60ie80HRT+vez6eW/t9/Z1wF7+ST3UVyDhyA8uXzZfMiIhIE69ev56KLLuLJJ59k4MCBxMbG0qRJE69jea7ID+RLSbVEAJUjT3zk/sGDUKcOtGjhWvmRke60PBERKVp2797N+vXrmTlzplr4mRT5lr7Fde9HlDjxj7JxI/TuDcuXw19/nfDmREQkiBISEnj77bcBaNasGevXr1fBz6LoF/20kfXh+VD069Vzg/dWr3aT7oiISNGwatUqoqOj6dOnDz/99BMApUuX9jhV4aOin7aN1193j8uXV8EXESkqrLW8/PLLtGzZkn///ZevvvqKxo0bex2r0CryRT+QVvVPpOhffz0MHOguoCMiIkVH//79ue2222jXrh1xcXHExMR4HalQK/JFP62hT3jo8X+UYcPcfVqPkIiIFBEdOnTg6aef5rPPPqNatWpexyn0ivzofZvW0i8ZdvxF/+yzYdo0N4hPREQKr9TUVB5//HFq1qzJTTfdRK9evbyOVKQU+ZZ+IP2YfmjoMb93+nR3xTxQwRcRKez+/vtvYmJiGDlyJMuWLfM6TpFU5Iu+Pc5j+vfeC716wUknwaZNBZFMRETyyyeffEJUVBSxsbFMnTqVSZMmeR2pSCr63ftp98da9K+/3l0m9403oHbt/M8lIiL545dffuHqq6+madOmzJgxgzPOOMPrSEWWD1r67v5Yi350NNx3H2zeXAChRETkhMXHxwPQsGFDPvroI3744QcV/BPkg6Kf1r2fx9H7qalu8h2ASpXAmIJKJiIix8Nay5QpUzjllFP4/vvvAbjqqquIiDjx6daLu6Jf9NPuw0LzVr1feMGN1u/YseAyiYjI8dmzZw+9evViwIABnHPOOZxyyileR/KVIl/0wXXtmzw22dNXU7e+iEjhsmzZMs455xxmzpzJmDFjmDdvHrU16CpfFfmBfAARxzAxz113udPzDhwowEAiInLMvvrqK1JSUli0aBEXXHCB13F8yTct/WNRubJG7IuIFAbbtm3jhx9+AOCBBx4gLi5OBb8AFauiP3IkbNlSwGFERCRP5s6dS1RUFN27dycpKYnQ0FAqVKjgdSxf80XRj8hD0Q8EYPRoqFULvvsuCKFERCRbycnJPPjgg3Ts2JHKlSsze/ZswsPDvY5VLPjimH5eWvqbNkG/fvD999CqVRBCiYjIEfbs2UOHDh1YsmQJN998M88884yuex9Evij6JUJyL/p16sArr8C6dTo3X0TEK2XLluWss85iyJAhdO3a1es4xY4vuvdL5OEc/UDATbvbuHEQAomIyCEJCQncdttt/P777xhjeO2111TwPeKLop/bOfpr18LVV8P+/UEKJCIiAKxatYro6GgmTpzIggULvI5T7Pmi6OfW0J85Ez79FIYODU4eEZHizlrLSy+9RMuWLYmPj2fevHkMGjTI61jFXtCLvjHmdWPMD8aY4Tm8XtEY87kxJtYY89+8bDM05OhV/4IL4KGHoHv34wgsIiLH7L///S+33347MTExxMXF0a5dO68jCUEeyGeMuQYItdaeb4yZbIypb639PctqfYC3rbVvG2OmG2OirbWxR9tuSC7d+zEx7iYiIgXr4MGDRERE0K9fP8LDwxkwYECep0mXghfsln5bYGba47nAhdms8w9wljGmAlAH2JjbRo/W0g8EjjmjiIgco9TUVB599FGaNm3K3r17KVWqFDfccIMKfiET7KIfCWxKe7wLqJ7NOt8CpwB3Ar+krXcYY8zNad3/sXD0ot+jB9x9N/zxxwkmFxGRbP3999+0a9eOUaNGER0d7XUcOYpgF/19QKm0x2Vy2P9IYLC1djSwFhiQdQVr7SRrbbS1NhpyHr2/bx+89x4891x+RBcRkaxmzZpFVFQUy5cvZ+rUqUybNo2yZct6HUtyEOyiv5yMLv0o4M9s1qkINDHGhALnAja3jeY0ej88HFavhg8+gNNOO564IiKSk0AgwPjx4znllFNYsWIFffv29TqS5CLYM/J9DHxjjKkFXAr0MMaMsdZmHsn/BPAGrov/B+Cd3DaaU/d+eDicdZa7iYhI/li7di2VK1ematWqfPjhh5QvX56IiAivY0keBLWlb63dgxvMtxi42Fobl6XgY61daq1tbK0tY61tb63dl9t2cxu9LyIiJ85ay+TJk2nevDn33nsvANWqVVPBL0KCfp6+tXa3tXamtXZrfm0zp5b+hRfCXXfBv//m155ERIqn+Ph4rr/+em688UbOPfdcnnzySa8jyXHwxYx82bX0d+92l9B9/nkoU8aDUCIiPvHTTz/RrFkz3nvvPcaMGcNXX31FrVq1vI4lx8EXV9kLyaalHx7upt5duxZK+OJTioh4o1q1alSvXp1p06bRStcmL9J80dLPbvR+ZCR07gxDhgQ/j4hIUbdt2zbuv/9+UlJSqFq1Kt99950Kvg/4ouhn19IPBNxNY/xERI7N3LlzOfvss3nhhRdYsWIFkPvVTKVo8EXRD83mj7FPHxg/HnYdMZ+fiIhkJykpifvvv5+OHTtStWpVli1bRsuWLb2OJfnIH0U/m5b+nDnw4INuVj4REcndgAEDGD9+PIMGDWLp0qWcpUlOfMcXQ9yydjsFAvDkk7B+PZx0kkehRESKiNTUVEJDQxkyZAjXXHMN1157rdeRpID4ouiHZumvCAmBgQO9ySIiUlQkJCRw5513Eh4ezsSJE2nWrBnNmjXzOpYUIH9072dzTN/mOmO/iEjxFRcXR3R0NG+88QaVKlXC6kuzWPBFSz/r6P3XXnPn5nfsCDVrehRKRKQQstby0ksvcd9991GpUiXmzZtHu3btvI4lQeLLlv7TT8OAAfD++x4FEhEppDZt2sSwYcOIiYkhLi5OBb+Y8UXRz9rSv+kmaNECdKaJiIizZs0arLWcdNJJLF26lM8++4yqVat6HUuCzBdFP+sh/XvvhaVL4dxzvckjIlJYpKSkMGrUKKKionjrrbcAaNiwoSbbKaZ8cUzfoD9eEZGsNm7cSK9evfjmm2/o06cPV199tdeRxGP+KPqZav6BA/Dnn1CtGlSq5FkkERFPzZ49m759+3Lw4EHefPNN+vTp43UkKQT80b2f6fH330PDhhAT41kcEZFCoW7duqxcuVIFXw7xR9HPVPX37nVFPzTUuzwiIl745ZdfeOONNwC4/PLLWbJkCfXr1/c4lRQm/ujez9TWv+oqaNcOtm/3MJCISBBZa5k8eTJ33nkn5cuXp2vXrpQpU4ZQtX4kC9+19AHKloXTT/cmi4hIMMXHx9OzZ08GDhzIeeedR2xsLGXKlPE6lhRSPmnpZ0hNVde+iBQPBw8epGXLlqxbt46xY8dy//33q3UvR+WLop+5qV+iBJQuDXFxUK+eh5lERAqItRZjDBEREdxzzz2cffbZtGrVyutYUgT4o3s/0+Nq1WD/ftfFLyLiN1u3buXSSy/liy++AGDw4MEq+JJn/ij6mar+1q2waZMr/iIifjJ37lyioqJYtGgRO3fu9DqOFEH+KPqZ2vrGQK1aRw7uExEpqpKSkrj//vvp2LEjVatWJTY2Vufey3HxR9FXgRcRH5s1axbjx49n8ODBLFu2jMaNG3sdSYoofxT9tPuPPoJTToExYzyNIyKSLzZs2ADAddddx3fffcfEiRMpVaqUx6mkKPNH0U+r+jt2wIYNMGeOt3lERE5EQkICN9xwA40bNwTfAFIAACAASURBVGb9+vUYYzRYT/KFL07ZS79EZJcuULcu6BLRIlJU/fjjj/To0YPffvuNhx56iDp16ngdSXzEJ0Xf3VetCu3be5tFROR4vfjiiwwZMoTKlSszb9482rVr53Uk8Rl/dO+jkXwiUvStXr2a9u3bExcXp4IvBcJXLf3Jk+F//4M+fdyV9kRECrtFixZRrlw5zjnnHF544QXCwsIOHbIUyW8+aek7jz8OTzwBv//uaRwRkVylpKQwcuRI2rVrx/DhwwEIDw9XwZcC5auW/lNPwfvv6wp7IlK4bdy4kV69evHNN9/Qt29fXnzxRa8jSTHhj6JPxuj9Ll08DiMichRr1qyhdevWJCcnM23aNHr37u11JClG/NG9r94wESkiGjRoQPfu3VmxYoUKvgSdL4o+QFISvPgiLFvmdRIRkcP98ssvXHrppezcuZMSJUowceJE6tev73UsKYZ8UfSNMWzZAnfcARdd5HUaERHHWsvrr79OdHQ0y5cvZ926dV5HkmLOJ8f0ISTETcyzf7/XaUREID4+nkGDBvHuu+8SExPDtGnTqFmzptexpJjzR9E3UKcOzJ3rdRIREWfo0KG8//77jB07lgceeICQEF90rEoR54+i73UAEREgEAgQHx9PxYoVefzxxxkwYADnn3++17FEDvFH0TeGgwchNRVKl/Y6jYgUR1u3bqVv377s37+fr7/+mqpVq1JVV/+SQsYX/U3GwD33QGQkDB3qdRoRKW6+/PJLoqKiDk22Exoa6nUkkWz5o+gDtWq5xzt3ehpFRIqRpKQkhg4dSqdOnahWrRqxsbHcfPPNmkpXCi1fFH2MYfhwsBbeeMPrMCJSXBw8eJCPP/6YwYMHs3TpUho3bux1JJGj8scxfa8DiEixMmvWLDp06EDZsmVZvnw55cqV8zqSSJ74oqWvnjQRCYZ9+/YxYMAArr76al566SUAFXwpUvxR9DEMHAitWsG333qdRkT86Mcff6R58+ZMnTqVESNGcPfdd3sdSeSY+aN737g591etgq1bvU4jIn7z7rvv0rdvX6pUqcL8+fO5+OKLvY4kclx8UfQB3nsPvvlGc++LSP5r1qwZXbp04cUXX6RKlSpexxE5br7o3gc44wy48UaoXt3rJCLiB4sWLeLOO+/EWkv9+vWZMWOGCr4Ueb4p+iIi+SElJYWRI0fSrl075syZwz///ON1JJF844uiby3ceis8+aR7LCJyPDZu3MjFF1/M6NGj6dOnDytWrFDrXnzFF8f0DxyAiROhRAl44AGv04hIUZSamsoll1zC5s2beeutt+jVq5fXkUTynS+KfmgoPPYYrFnjdRIRKWoOHDhAWFgYoaGhTJo0idq1a1OvXj2vY4kUCF9074eHw/DhMGOG10lEpCj55ZdfaNmyJePHjwegTZs2Kvjia74o+pqQT0SOhbWW1157jebNm7N161aioqK8jiQSFEEv+saY140xPxhjhuey3svGmCvyss2E/bBgAfz2W/5kFBH/io+Pp2fPntx00020atWKuLg4Lr30Uq9jiQRFUIu+MeYaINRaez5wmjGmfg7rXQTUsNZ+mpft/vILxMTALbfkY1gR8aWff/6Zjz/+mLFjxzJ37lxq1qzpdSSRoAl2S78tMDPt8VzgwqwrGGPCgFeBP40xV+Vlo+XLQ8uW7ti+iEhWgUCABQsWAHD++efz559/MmzYMEJCfHGEUyTPgv0XHwlsSnu8C8hu/ry+wM/Af4CWxpg7sq5gjLnZGBNrjIkFqF8PliyBL74ooNQiUmRt2bKFDh06EBMTw/LlywGoUaOGx6lEvBHsor8PKJX2uEwO+z8HmGSt3Qq8BRxxZQtr7SRrbbS1NrrAkopIkTdnzhyioqL4/vvvefXVV2nWrJnXkUQ8Feyiv5yMLv0o4M9s1vkfcFra42jgr9w2qkn4RCSr4cOHc+mll1KjRg1iY2MZOHAgxuhcHyneTrjoG2NC0gbe5cXHQB9jzASgG/CTMWZMlnVeBy42xvwfcCvwVG4bnfy6u7zuuHHHklxE/KxOnTrceuutLFmyhEaNGnkdR6RQyHVGPmNMODAEGAeUtNYmpi0vCXTHDcz7Eiid27astXuMMW2B9sB/0rrw47KssxfoeiwfIrKMu9+06ejriYi/TZ8+ndDQULp3786gQYO8jiNS6OSlpR8CDAXuAB7JtPwt4CHc3DjJed2htXa3tXZmWsHPFz17wJ498Oyz+bVFESlK9u3bR//+/enVqxdTp07F6spbItnKy9z7SUAC8DkQa4z5AaiPO/2uubV2vzEmteAi5k3Zsl4nEBEvrFy5kh49evD7778zYsQIHnnkER27F8lBrkXfWhswxiRba/9njLkH2ACsBJYCVxljZh59CyIiBeOPP/7gvPPOo2rVqixYsIC2bdt6HUmkUDvWgXxbrbU/AlWA54HxQJ18T3WMPvgArrgCVqzwOomIBENKSgoAp512Gs899xw//vijCr5IHuS56BtjWgIfGGM64U6l+wPYZq1dhsfXvPn6a/jsM3dcX0T87euvv+aMM85g5cqVAAwePJgqVap4nEqkaDhq974x5jxgWNrTlbiW/cdAL9wI+/i00+9Kpd2D+yFR0lo7uGAiH+nee8Gsh/rZzuQvIn6QkpLC6NGjGTNmDPXr19cUuiLHIbdj+qfhps4NAz4CRgF34c6lt8Ae4HRcoa+b9p5QoGQBZM05ZF1D167uXH0R8Z8NGzbQq1cvvv32W/r3788LL7xAmTJlvI4lUuQctehba6cD040xf+MK/JO4Yh8DzMKdm38j8Lu1tksBZz0qFXwR/3rjjTeIi4vjrbfeolevXl7HESmy8to/lmStvR7YDZQHDgDXAeWAU/B4JtwFC+GFFyAx0csUIpKfEhMT+fnnnwF46KGHWLVqlQq+yAk61oNirwANgX9wXf/R1trl+Z7qGH34Adx5Jxw86HUSEckPP//8M+eeey4dOnQgMTGRsLAwTj31VK9jiRR5uRZ942a5iDDGVAJm4I7vR+JO2atWsPHypu3FcNttUKpU7uuKSOFlrWXSpElER0ezbds2XnvtNUrpP2yRfJOXGfkicMfuOwHvWGvXABhj+gJvGmNaAeEFFzF3110L3Vp4mUBETlRiYiL9+vXjvffe45JLLmHatGm67r1IPstL934KcDuulf9g+kJr7RfAs0AA98NAROS4RUREcPDgQcaNG8eXX36pgi9SAPIyDW8K8Hba04Qsrz2R1v3fvACy5dman6BVTTjpJC9TiMixCgQCTJgwgW7dunHyySfz8ccfa958kQJ0wrNbWGdVfoQ5XhMmQJMmXiYQkWO1ZcsWOnTowNChQ5k6dSqACr5IActT0TfGRBhjPjTGRKQ9r2KMqWaMiTTGpBpjIjOt+6Yx5oKCCpydGjV0lT2RouSLL74gKiqK77//nldffZXhw4d7HUmkWDhq0TcZP7sDwFVp9wCTgS+BZNy8+wfT1i8H9ABqFUTYnIwdCxs2BHOPInK8ZsyYwWWXXUaNGjWIjY1l4MCBauGLBEluLf1ZxpgrrbXJANbaZGPMTbiR/EOstUlusU1JW78vbgKfjwsssYgUSda6Obwuv/xyHnnkEZYsWUKjRo08TiVSvORY9I0xIbiL7LyTdnoexpg6wNPA/dbaBVnWLwncDYxM/5EgIgLw1ltvceGFF5KYmEjZsmV59NFHdf69iAdyLPrW2oC1diTuanp90hY/Dyyx1j6bzVueALYAk/I9ZS4euB9uvTXYexWR3Ozbt4/+/fvTp08fQkJC2Lt3r9eRRIq1vJyy9znwuTEmADwA7AN3vN+6/jpjjHkauBo4z1obyHlrBWPHTti5M9h7FZGjWblyJT169OB///sfjzzyCCNGjKBEibzMByYiBeWo/wUaY+YA+9OeWmAcEJI2iv9fY0zLtNeuAM631m4rsKRH8eQ4uOpsL/YsItmx1nLrrbeSkJDAggULaNOmjdeRRITcW/orSBuZj2vJNwTexU27uxn4HngOOAl4xBhzlxfH86tV08Q8IoXBzp07KVGiBBUqVGD69OmULVuWKlWqeB1LRNIcdfS+tfYha+2juMF74C6lWyZt+YvW2hdwPQBNgRbAqwWaVkQKrYULF3L22Wdz++23A1C3bl0VfJFCJi9X2XsCmIcr7hcBvYwxt2dex1r7G+48/kuNMVcWRNCjmTYNvvwy2HsVEYCUlBRGjBhBTEwM5cqV47777vM6kojkILfJee4FBgJ3AVhr/wB6AU8YY05LXy3ttc24Y/4jCyxtDhYsgOXLg71XEdm4cSNt2rRhzJgx9O/fn+XLl9O0aVOvY4lIDnJr6a8BOgNLwZ27n3Z+/mfAU9msPxU4yxhzVr6mzEXv3tChQzD3KCIAISEhbN26lenTpzN58mQiIyNzf5OIeCa3Y/pzrbVLcAP3DO6YPrgW/ZXGmDPBzc2ftv4u3IQ+XQoscTZiYiA6Oph7FCm+EhMTef755wkEAtSuXZu1a9fSs2dPr2OJSB7k9Sp7FjdKPwBgrY0DzgP+AhaR1sWf5h1gfj5mFJFC4qeffqJly5bcddddfP311wCEhYV5G0pE8ixPRd9am2StvcdauyfTslhr7QFr7cXW2gOZlj9nrf2+IMLmZPVq2LgxmHsUKV6stUyaNIkWLVqwfft25syZQ7t27byOJSLHKK8t/UJtwgTDZ595nULEv+655x4GDRrEBRdcQFxcHB07dvQ6kogch1znxDTGlABqWmtzbUsbY04Hxllru+ZHuLw66yw4+eRg7lGkeOnatSs1a9Zk6NChhIT4oq0gUiyZ9Mtd5riCMc2Ab621pTMtqwF8DrTK3LVvjIlKW7dsAeU9QkTN+vbtzxZyXXNNySeSX1JTU3nyySfZs2cP48aN8zqOiGRhjFlurT3mIex5+cl+AMg6tW4yEAUkZVmelM26IlKEbN68mQ4dOvDwww/z119/EQgE/RpaIlJA8lL0U9NumaWAu/xuluXefDscvbNCRPLo888/Jyoqih9++IHXXnuN6dOnqztfxEd88V9z/wHw8cdepxAp2rZv3851111HrVq1WL58OTfeeCPGmNzfKCJFhm8ubh0a6nUCkaJp27ZtVK9enWrVqjFnzhxatmxJyZIlvY4lIgUgry398saYP9JvQBxgMi9LWz6v4KLmbMob0LmzF3sWKdreeust6tWrxzvvvANA69atVfBFfCyvLf0DwKN5WK8WMPT44xwfY9xNRPJm79693H777bz55ptcdNFFXHjhhV5HEpEgyGvRP2itnZrbSmlz8Qe96ItI3q1YsYIePXqwbt06Ro0axcMPP0yJEr450iciR+GL/9KfegoaPQING3qdRKTwW7duHYmJiSxcuJDWrVt7HUdEguiYi74xZiBwEUeexgdQ/oQTHYfVq2HvXi/2LFI07Nixg8WLF3PFFVfQtWtXLrvsMl0GV6QYykvRNxw+4K80UIm0c/WzKJMfoY7VfffBmWd6sWeRwm/hwoX06tWLhIQE/vrrLypUqKCCL1JM5aXol0y7AWCtfR54PrsVjTENgaBeYQ+gSRMo70kfg0jhlZKSwqhRoxg7dixnnHEGn3/+ORUqVPA6loh4KNeib639kUxFPxfhQKkTSiQiJyw5OZl27drx7bffcsMNN/D888+rdS8i+TMjnzHmbGNMKLAaqJ4f2zwW8+bDv/8Ge68ihVdYWBidOnVi+vTpvP766yr4IgLk7Sp75wLLsplnP/31UNyFdmoD/wCnW2vX5nfQnETUrG/DKi9k9acnUbdusPYqUvgkJiYyZMgQunXrRtu2bb2OIyIFqCCvsvcOR+net9am4gb7HQR6A/PSfggEzSXtQYcqpTj76aefaNmyJRMnTmTJkiVexxGRQiovA/mSgIPGmFFpz7Nr8VvcKXx3A++n/RAImr59oGLFYO5RpHCw1vLqq69y9913U7ZsWebMmUPHjh29jiUihVRein56kb8LWAVcCCwGzgN+J+N8/SbA6UC7fM4oIjn45JNPGDRoEO3bt+fNN9+kRo0aXkcSkULsWAbyWaADriv/mrT7CcDotMdXA+9aa//J75C52bkTUoPatyDirb1ps1FdccUVzJgxgzlz5qjgi0iujmf0vk27ZV32CvD0CSc6Dvfeq9H7Ujykpqby+OOPc/rpp7NhwwZCQkLo3r07ISH5ciKOiPhcjt37xpgQ4FXc7HutgcyD87K7pt0Oa+2e/I2XN1WqQGhQhw6KBN/mzZvp3bs3CxcupGfPnpTXjFQicoyOdkw/DHep3DLA57iJdwqlCRM0el/8bfbs2fTv35/9+/czefJk+vfvj9H1pEXkGOXYJ2itPWitvRTYgCv88blsq4Expmt+hssrffeJ382YMYNatWqxfPlyBgwYoIIvIsclr1fZszncZ9Ye6A+8d4KZRAT4/fffCQQCnHnmmUycOJESJUpQsmReZ8QWETlSXkf/mLTbkrT7eWnLHwbGpT1+FQg3xlyarwnzYNgwOHAg2HsVKTjTpk2jWbNmDB48GIAyZcqo4IvICTuWlv6YtMdTsrxmcKP2DwDPADcBX+S0IWPM60AjYLa1dsxR1qsOzLHWnpNbuL83qotf/GHv3r3cdtttTJs2jdatW/Pmm296HUlEfCQvRT8cKGmtzfZ0POMOLj6NG93/JjDSGBNmrU3OZt1rgFBr7fnGmMnGmPrW2t9z2O9T5PGKfWOfgLCwvKwpUnitX7+eDh068McffzBq1CiGDx9OqE5LEZF8lJei/xIZs+5lpySutR9hrd1qjGmXXcFP0xaYmfZ4Lm52vyOKvjGmHZAAbM1DPurUAZ2mLEVdrVq1aNiwIa+//jqtW7f2Oo6I+FCupdJa+4y19uBRXk8E6gLb0p6vPMrmIoFNaY93kc1leI0x4cAI4MGcNmKMudkYE2uMic0tv0hhtmPHDgYNGkR8fDwRERF88sknKvgiUmDypX1srf3L5naNXmcfGV32ZXLY/4PAy9baHOfYs9ZOstZGp19WcOZMHdCXomfBggVERUUxZcoUFi9e7HUcESkGgt0pvhzXpQ8QBfyZzTqXALcZY74GmhpjXstto5/Pzq94IgUvJSWFhx9+mEsuuYRy5cqxdOlSXRlPRIIir6P388vHwDfGmFrApUAPY8wYa+3w9BWstYf6No0xX1trB+a20a7dCiSrSIG4//77eeaZZ7jhhht4/vnniYyM9DqSiBQTJm+98vm4Q2Mq4iby+T9rbZ4G6h1NRM369t3Pv+bqc2qfeDiRApSUlER4eDibNm3i22+/pXv37l5HEpEiyhizPP0Q97EI+ph3a+1ua+3M/Cj4IkXB/v37GTRoEJ07dyYQCFC7dm0VfBHxhC9OdPvfOq8TiGRvzZo1tGzZkkmTJtGsWTMCgYDXkUSkGPNF0R//H68TiBzOWssrr7xCixYt2LlzJ3PnzmXcuHGUKBHsYTQiIhl8UfTr1fc6gcjh9u3bx9ixY2nTpg1xcXG0b9/e60giIkEfvV8g7h/qdQIRZ/ny5TRp0oSyZcvy3XffUbt2bUI0XaSIFBL6NhLJB6mpqTz++OOce+65jB8/HoA6deqo4ItIoeKLlr6IlzZv3kzv3r1ZuHAhPXv25I477vA6kohItnzRDBk2zOsEUlylT6W7ZMkSJk+ezNtvv025cuW8jiUiki1ftPQP5ng5IJGCVbVqVerVq8cbb7xBgwYNvI4jInJUvmjpj3nc6wRSnPz222888cQTADRp0oTvv/9eBV9EigRfFP3SpXJfRyQ/vPnmmzRr1oynnnqKzZs3A2CMrvIoIkWDL4q+SEHbu3cvffr0oV+/fjRv3py4uDhq1arldSwRkWPii6L/7rteJxA/s9bSrl07pk+fzqhRo1iwYAEnnXSS17FERI6ZLwbyxf3odQLxo0AggDEGYwwjRoygQoUKtG7dOvc3iogUUr5o6Xfr5nUC8Zvt27fTuXNnXnzxRQCuvPJKFXwRKfJ8UfSbnuN1AvGT+fPnExUVxYIFCwgPD/c6johIvvFF0RfJD8nJyTz00EO0b9+eihUrsnTpUgYNGuR1LBGRfOOLor9mjdcJxA9iY2MZN24cN954I8uWLePss8/2OpKISL7yRdH/8EOvE0hR9ssvvwBw/vnnExcXx6uvvkpkZKTHqURE8p8vin6TJl4nkKJo//79DBo0iLPOOoslS5YAboY9ERG/8sUpe9dcoxnR5NisWbOGHj168NNPP/HAAw/QrFkzryOJiBQ4XxR9kWPx2muvcccdd1C+fHnmzp1L+/btvY4kIhIUvujeT0ryOoEUJfHx8bRp04a4uDgVfBEpVoy11usMJySiZn3b4uJFfDtd86BLzr777jv27t1Lp06dCAQCAISE+OI3r4gUQ8aY5dba6GN9ny++9TR/iuQkNTWVMWPG0KZNG0aMGIG1lpCQEBV8ESmWfPHNd/c9XieQwmjTpk1ccskljBgxgm7dujF//nxdBldEijUN5BNf2rRpE1FRUSQmJvLGG2/Qr18/FXwRKfZ8UfT1VS7prLUYY6hVqxa33347PXr0oEGDBl7HEhEpFHzRvf/++14nkMLgt99+o3Xr1vzyyy8YYxg1apQKvohIJr4o+ps3e51AvGStZerUqTRr1oyff/6ZzfqDEBHJli+K/rXXep1AvLJ371769OlD//79iY6OZtWqVcTExHgdS0SkUPJF0a9d2+sE4pVnnnmGd955h9GjRzN//nxq649BRCRHvhjIJ8VLIBBg69at1KpViwceeIBOnTrRsmVLr2OJiBR6vmjpr1zpdQIJlu3bt9O5c2cuuOAC9u3bR0REhAq+iEge+aLoL17sdQIJhvnz5xMVFcWCBQsYOnSornkvInKMfFH0mzb1OoEUpJSUFB566CHat29PxYoVWbp0Kbfeeqsm2xEROUa+KPqtWnmdQAqSMYbvv/+egQMHsmzZMs4++2yvI4mIFEkayCeF1ocffkirVq2oUaMGc+bMoWTJkl5HEhEp0nzR0t+92+sEkp/279/PzTffzLXXXsv48eMBVPBFRPKBL4r+e+95nUDyy+rVq2nRogWvvfYaDz74IOPGjfM6koiIb/iie79iBa8TSH6YM2cOXbp0oXz58nz55Ze0b9/e60giIr7ii5Z+125eJ5D80LJlS3r06EFcXJwKvohIAfBF0Zei69tvv+W6664jKSmJSpUq8cYbb1C9enWvY4mI+JKKvngiNTWVxx57jDZt2vDjjz+yadMmryOJiPieL4r++xrIV6Rs2rSJSy65hEceeYQePXqwYsUK6tat63UsERHf88VAvr37vE4gx6Jnz56sWLGCKVOm0LdvX82sJyISJL4o+tde63UCyc3BgwdJTU2ldOnSvPLKK4SGhnLmmWd6HUtEpFjxRfd+uXJeJ5Cj+fXXXznvvPO44447AGjUqJEKvoiIB3xR9KVwstYyZcoUmjdvzsaNG+nSpYvXkUREijVfFP3YWK8TSFZ79uyhd+/eDBgwgBYtWhAXF0fnzp29jiUiUqz5ouj//pvXCSSrf/75hzlz5vDYY48xb948ateu7XUkEZFizxcD+Zo39zqBAAQCAT7++GO6dOlC3bp1WbduHRUqaI5kEZHCwhct/TM0Jsxz27dv5/LLL+faa69l9uzZACr4IiKFjC9a+uKtefPm0adPH3bv3s3LL7/M5Zdf7nUkERHJhi9a+lu3ep2g+PrPf/5Dhw4dqFixIsuWLeOWW27RZDsiIoWUL4r+N//ndYLi65xzzmHgwIHExsbSpEkTr+OIiMhR+KJ7v3oNrxMULzNnzuSvv/5i6NChtG/fXpfBFREpInzR0m/d2usExUNCQgI33XQT3bt3Z9asWaSkpHgdSUREjkHQi74x5nVjzA/GmOE5vF7eGPOFMWauMeYjY0x4rttEx5AL2qpVq4iOjub1119n2LBhLFy4kBIlfNFRJCJSbAS16BtjrgFCrbXnA6cZY+pns1ovYIK1tgOwFegUzIxypN27d3PhhRfy77//8tVXXzF27FjCwsK8jiUiIsco2C39tsDMtMdzgQuzrmCtfdla+1Xa06rA9qzrGGNuNsbEGmNiAT7+uGDCFneJiYkAVKxYkalTpxIXF0dMTIzHqURE5HgFu+hHApvSHu8Cque0ojHmfKCitXZx1testZOstdHW2mj3vCCiFm/ffvstZ555JrNmzQKgS5cuVKtWzeNUIiJyIoJd9PcBpdIel8lp/8aYSsALwA152eiVV+VLNgFSU1MZPXo0bdq0ITw8XHPmi4j4SLCL/nIyuvSjgD+zrpA2cO89YJi19q+8bDTUF+cgeO/vv/8mJiaGkSNH0rNnT1asWEF0dLTXsUREJJ8Eu1x+DPQxxkwAugE/GWPGZFnnRqAZ8LAx5mtjTPcgZyy2FixYQGxsLFOnTuWtt96iXLlyXkcSEZF8ZGyQD4gbYyoC7YH/s9ae8AS6ETXr22GP/x+jbqh54uGKoYMHD7JixQrOP/98rLVs2bKFWrVqeR1LRESOwhizPH1c27EIese4tXa3tXZmfhT8dFu35NeWipdff/2V8847j/bt27Njxw6MMSr4IiI+5ouj4TrsfGystUyZMoXmzZuzceNGZsyYQdWqVb2OJSIiBcwXRb+mevbzLDU1lT59+jBgwABatGhBXFwcnTt39jqWiIgEgeZRLWZCQ0OpVq0ajz32GMOGDSM0NNTrSCKFzp49e9i+fTvJycleR5FiJiwsjGrVqhXYQGpfFP2NfwNne52i8AoEAkyYMIGLLrqIc889lwkTJngdSaTQ2rNnD9u2baN27dqUKlUKY3RtDwkOay2JiYls2uTmsCuIwu+L7v01a7xOUHht27aNyy67jKFDh/LOO+94HUek0Nu+fTu1a9emdOnSKvgSVMYYSpcuTe3atdm+/YgZ6POFL1r6J2nSuGzNnTuXvn37Eh8fz8SJExk0aJDXF36L6AAAG2hJREFUkUQKveTkZEqVKpX7iiIFpFSpUgV2aMkXRb9JE68TFD7z58+nY8eONGrUiHnz5nHWWWd5HUmkyFALX7xUkH9/vujelwypqakAtG3blqeeeoply5ap4IuICOCTop+U5HWCwuHdd9+lUaNGbN26ldDQUIYMGULp0qW9jiUiHtu5cyfXX389FStWpFq1aowYMeLQawcOHGDw4MGUL1+e6tWrM3bs2EOvjRo1CmMMISEhVKtWjW7duvHrr7968REkn/ii6C/82usE3kpISGDgwIH06NGDSpUq6TQjETlM9+7d2bx5Mx988AHDhg3jiSee4N133wXgzjvvZPbs2bz11luMHj2aRx99lA8++ODQe2vWrMnixYt59tlnWbVqFa1atWLDhg1efRQ5UdbaIn0Lr1HPDnl2sy2u4uLibIMGDawxxj700EM2KSnJ60giRdrPP//sdYR8tX79egvYFStWHFrWpUsXe9lll9nNmzfb0NBQ+8477xx6rV+/frZNmzbWWmtHjhxpTznllEOvbdmyxZYtW9YOHjw4WPGLrdz+DoFYexw10xcD+S6+2OsE3hk7dizx8fF89dVXxMTEeB1HRAqZXbt2Aa6LP91//vMf4uPjmT9/PqmpqbRv3/7Qa+eccw6ff/55ttuqUaMGV1xxRY6vS+Hni+794mbXrl1s3LgRgJdffpm4uDgVfBHJVuPGjalTpw79+/fnww8/xFpLvXr1aN68OWvXrqVs2bJUrlz50Pr9+vVj4cKFOW7v7LPPZsOGDSQmJgYjvuQzFf0i5ptvvqFp06Zcf/31WGupVKmSLpYjIjmKiIjg008/JSIigmuvvZbo6Gh++OEHwLX+s876VqFCBRo3bpzj9ipWrAjAv//+W3ChpcD4ougvXep1goKXmprK6NGjadu2LRERETz77LM6l1gkiIxxt8yuuMIt+/TTjGWTJrllN9+csWzzZrcs65Wrmzd3y5cvz1g2apRbNmpUxrLMrx+PqKgo1q5dy8svv8zmzZtp27Yts2fPJjk5mZAQVwYWL16MMebQLSf63inafFH04+O9TlCwtm/fTkxMDCNHjuT6669nxYoVNG/e3OtYIlKEhIeHc8stt7B69WoaNmzIoEGDiIyMJCEhAXDd9itXruTVV1896nZ2794NQPny5Qs8s+Q/XxT9li29TlCwIiMj2b9/P1OnTmXatGmULVvW60gixY617pbZp5+6ZVdckbHs5pvdskmTMpbVquWWbd58+PuXL3fLM/+GHzXKLcvc0j+R3/ivvvoqnTp1OvS8SpUqjBgxgk2bNlG5cmV27dpFfHw8pUuXpmnTplSvXv2o21uzZg2nnnqq5gAponxR9CtU8DpB/jtw4ABjxowhISGByMhIFi9eTN++fb2OJSJFTMmSJZk/f/5hx+D/+ecfSpUqxTXXXAPAp5mOT8TFxeW4rR07dvDJJ59w9dVXF1xgKVC+OGXPb9auXUuPHj2Ii4ujfv36dO/e/dBxNxGRY3HFFVdQsWJFrrvuOh588EG2b9/OyJEjufnmm2nSpAldu3bl9ttvByA0NPSIS28nJSWxbNky1q1bx5gxYyhbtiwPPfSQFx9F8oEvKskff3idIH9Ya5k8eTLNmzdn06ZNfPbZ/7d379FR1dcCx787kAcBLoEACaEKmlCkEElTIYKtJgrycIkULSihEgEBC1iwApUGE0BtsS2lV6mI1XBrW65VbkVLQR6VUCpqoAHkGisuo3BBERALhCQQsu8fZzJOQjAPMjPMyf6sNcuZOb9zzp6fQ/ac3+v8hTFjxgQ7LGNMCIuJiWHTpk1UVlYyatQoHnroIe6++24WL14MwMqVK/ne977HfffdR25uLtOmTau2/yeffEJaWhozZ86kf//+vPXWWzZjKISJ1uykCjGRXXrotDlbWTKrS7BDuWiLFi3i4YcfJiMjg9///vck1Bzqa4zxu6KiInr16hXsMEwzV9f3UER2quo1DT2uK5r3u3cPdgQXR1URETIzM4mIiODBBx+kRYsWwQ7LGGOMy7iieT8pKdgRNE5lZSU///nPGT16NKrKlVdeydy5cy3hG2OM8QtXJP1QdPjwYYYPH86cOXOorKykrKws2CEZY4xxOVck/ZMngx1Bw2zYsIG+ffuSn5/P8uXLeemll2jVqlWwwzLGGONyrkj6obQM7+nTp8nKyiI2NpaCggKmTJliy1oaY4wJCFcM5GvTJtgR1O3AgQMkJCQQHR3Na6+9RmJioq1oZYwxJqBccaWflhbsCL7aCy+8QJ8+fbzzYpOTky3hG2OMCThXJP1LVUlJCZMmTeLOO++kd+/ejB07NtghGWOMacYs6fvJO++8wzXXXMNzzz3HvHnzyM/Pp3uoLyhgjDEmpLki6b/xRrAjOF9paSmnT59m06ZNPProo4SHhwc7JGNMM7Ny5UpEBBEhLCyMbt268eCDD3pvp+uvcwbqAuejjz7yfr6aj5UrVwYkhlDjioF85eXBjsBx7Ngx1qxZw4QJE+jfvz/79u0jIiIi2GEZY5q5goICzpw5w9tvv838+fM5fPgwzz//fLDDajLLly/nWzXuP3zFFVcEKZrz7dq1iy1btjBz5sxgh+KOpD9gQLAjgK1bt5KZmclnn33GjTfeSPfu3S3hG2MuCddc4yzRPnDgQEpKSli4cCG//e1viYyMDHJkTaNnz57ez3gp2rVrF0uXLr0kkr4rmvejooJ37oqKCnJzc8nIyKBVq1Zs377d+u6NMZes1NRUzpw5w7Fjx4IdigkCVyT9YFFVRowYwYIFC8jMzGTnzp2kpqYGOyxjjLmgw4cPIyLExsYCcPDgQUaOHEm7du2Ij49n1qxZVFZWAl/2me/atYs77riDNm3acNVVV7F9+3bv8d59912uu+46oqKiGDBgAMXFxdXOd/z4ccaNG0ebNm2Ij49nwYIFVN3dNT09nSlTptCvXz86dOjA2rVrGTBgADExMbz88stN8nnLy8uZMWMGHTp0oH379syYMYNynz7hLVu2ICKcO3eORYsW0b1792pdH2fPnmXu3LnExcURGxtLVlYWJ06c8G4/ceIE48ePp1OnTsTExDBq1CiOHDkCQG5uLiLCPffcw8cff+wdb5Cbm9skn61RVDWkHxHxSbp09SENlueff15/97vfBe38xpim9e677wY7hCaTl5enzp95x969e7Vnz546aNAg73s33HCD9unTRzdt2qQvvfSSdujQQfPy8lRVtbi4WAHt06ePTp8+XTdu3KipqamakpKiqqpnz57VHj166IABA3T9+vW6cOFCDQ8P127dunmPf/PNN+vXv/51XbNmjS5fvlzbtGmjjz32mPfcbdu21dWrV2vfvn21ZcuWmpeXp0OGDNFhw4bV+fmq4nv99dcvWObee+/V+Ph4/eMf/6irVq3SuLg4nTx5snf766+/roBOnjxZ+/Xrp7/61a+0qKjIu33u3LkaFxenL7zwgv7lL3/RxMREHTNmjHf7jBkzNCEhQdesWaOvvPKKJicn66RJk1RV9eDBg1pQUKA5OTnapUsXLSgo0IKCAj148GCdn62u7yGwQxuRM13Rp3/oUODOVVZWxuzZs0lNTeWee+5h3LhxgTu5MSYouv94bbBDAOCjn93SqP18l/pOTU3l2WefBZyLvrFjx3LdddfRu3dvKioqWLZsGW+99RZZWVnefXr16sUTTzwBwLx587jzzjsB5z4i+/btY926dSQmJjJkyBAKCwv55z//CcC2bdvYsGEDhYWFpKSkAM5S5PPnz+eBBx4A4K677mLUqFGsWbOGuLg4srKyKC4uJj8/v96fLyMjo9rr4uJiunfvzv79+3n22WdZvXo1I0eOBCAyMpI77riD7OxsLrvsMu8+RUVFbNu2rdpYrNLSUpYuXcrTTz/N6NGjATh69Cj33nsvZWVlREVFsX//fvr27cuIESMA6NGjB59//jkACQkJJCQksHfvXiIiIi6JcQeuaN7v0SMw5ykqKiItLY0nn3ySDz74IDAnNcaYi1RYWMjatWsREebMmcPll18OOD8GRo8ezWuvvcYtt9xCXFwcW7ZsobS0tNr+kydP9j6PjY2loqICgH379tGhQwcSExO926+//nrv8127dtGuXTtvwgenSb+kpMT7N7RLly7eWHyfN8QzzzxDYWGh95GQkADAnj17qKysJD09vdr5Kysr2bNnT7Vj/PKXvzxv8PUHH3xAeXk5WVlZ3qb5rKwszp49y/79+wGYOHEimzdvZuDAgcyZM4eDBw8ycODABsUfSK640u+a4N/jqyp5eXnMmDGD6Oho1q5dy/Dhw/17UmPMJaOxV9iXipSUFFJS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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9921304380711844"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林比SGD 好很多，面积也高很多\n",
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9869005328596803"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度和召回率 也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8199594170817193"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "多类别分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])\n",
    "#也就是说第5个是正值\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#返回的最大值的索引 \n",
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列，\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, tol=-np.infty, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#随机森林策略\n",
    "forest_clf.fit(X_train,y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.1, 0. , 0. , 0.2, 0. , 0.6, 0.1, 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])\n",
    "#第六个最有可能是正的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "评估分类器\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\administrator.desktop-0hpsd3a\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.84978004, 0.87054353, 0.81362204])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确率\n",
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将输入进行简单缩放 ，可以得到准确率 90 %以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "ename": "MemoryError",
     "evalue": "Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mMemoryError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-61-9e5968626d88>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mX_train_scaled\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mscaler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mMemoryError\u001b[0m: Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64"
     ]
    }
   ],
   "source": [
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "错误分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx=confusion_matrix(y_train,y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用matplotlib的matshow 函数来查看混淆矩阵的图像表示\n",
    "plt.matshow(conf_mx,cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "row_sums=conf_mx.sum(axis,keepdims=True)\n",
    "norm_conf_mx=conf_mx/row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如何优化分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# knn支持多标签分类，不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])# \n",
    "# 评估多标签分类器\n",
    "y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)\n",
    "f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")\n",
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个权重（该目标标签实例的数量），设置average='weighted'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "多输出分类\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "例子：构建一个系统去除图片中的噪声，输入一张有噪声的图片，它将输入一张干净的数字图片，分类器输出是多个标签，一个像素一个标签，每个标签多个值0到255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#增加噪声\n",
    "noise=np.random.randint(0,100,(len(X_train),784))\n",
    "X_train_mod=X_train+noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod=X_test+noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit=knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
